package com.scott.itcast.queue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

/**
 * 阻塞队列
 * 2个线程放数据  1个线程取数据
 */
public class BlockingQueueTest {
	public static void main(String[] args) {
		
		//这个队列允许放3个数据
		final BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(3);
		
		//2个线程放数据
		for(int i=0;i<2;i++){
			new Thread(){
				public void run(){
					while(true){
						try {
							int data =(int) (Math.random()*1000);
							Thread.sleep(data);
							System.out.println("线程["+Thread.currentThread().getName() + "]准备放数据...");		
							
							//如果队列满了。put就放不进去。阻塞 只能等取走了1个数据才能放数据
							queue.put(data);
							System.out.println(Thread.currentThread().getName() + "已经放了数据["+data+"] 队列目前有" + queue.size() + "个数据");
						} catch (InterruptedException e) {
							e.printStackTrace();
						}

					}
				}
				
			}.start();
		}
		
		//1个线程取数据
		new Thread(){
			public void run(){
				while(true){
					try {
						//将此处的睡眠时间分别改为100和1000，观察运行结果
						Thread.sleep(1000);
						System.out.println("线程["+Thread.currentThread().getName() + "]准备取数据...");
						
						//如果队列空了。take就取不到了。阻塞    只能等放入1个数据才能取数据
						int data =queue.take();
						System.out.println(Thread.currentThread().getName() + "已经取走数据[" +data+ "].队列目前有" + queue.size() + "个数据");					
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
			
		}.start();			
	}
}
